﻿
Функция ПолучитьОтборДляОтчета()
	Выборка = ПланыОбмена.Мобильные.Выбрать();
	Пока Выборка.Следующий() Цикл
		Если НЕ Выборка.ЭтотУзел Тогда
			возврат Выборка.Ссылка.Код;
		КонецЕсли;
	КонецЦикла;
КонецФункции

// Процедура читает из регистра сведений запись с данными отчета
&НаСервере
Процедура ПрочитатьЗапись()
    
    НаборЗаписей = РегистрыСведений.МобильныеОтчеты.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Вид.Установить(Перечисления.ВидыМобильныхОтчетов.ОстаткиТоваровНаСкладах);
    НаборЗаписей.Отбор.Получатель.Установить(ПолучитьОтборДляОтчета());
    НаборЗаписей.Прочитать();
    Если НаборЗаписей.Количество() > 0 Тогда
		
		Настройки = НаборЗаписей[0].Настройки;
		
		Если НаборЗаписей[0].ИнформацияРасшифровки <> "" Тогда
		    ЧтениеXML = Новый ЧтениеXML;
		    ЧтениеXML.УстановитьСтроку(НаборЗаписей[0].ИнформацияРасшифровки);
		    ДанныеРасшифровки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
			ИнформацияРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
		Иначе
			ИнформацияРасшифровки = "";
		КонецЕсли;
		
        ОбновлятьПриОбмене = НаборЗаписей[0].ОбновлятьПриОбмене;
        НовоеСодержимое = НаборЗаписей[0].Содержимое.Получить();
        Если НовоеСодержимое <> Неопределено Тогда
            Содержимое = НовоеСодержимое;
		КонецЕсли;
		
    КонецЕсли;
    
КонецПроцедуры

// Процедура записывает в регистр сведений запись с новыми настройками отчета
&НаСервере
Процедура ОбновитьЗапись()
    
    Код = ПолучитьОтборДляОтчета();
    НаборЗаписей = РегистрыСведений.МобильныеОтчеты.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Вид.Установить(Перечисления.ВидыМобильныхОтчетов.ОстаткиТоваровНаСкладах);
    НаборЗаписей.Отбор.Получатель.Установить(Код);
    
    Запись = НаборЗаписей.Добавить();
    Запись.Вид = Перечисления.ВидыМобильныхОтчетов.ОстаткиТоваровНаСкладах;
    Запись.Получатель = Код;
    Запись.Настройки = Настройки;
	
	Если ИнформацияРасшифровки = "" Тогда
		Запись.ИнформацияРасшифровки = "";
	Иначе
	    ЗаписьXML = Новый ЗаписьXML;
	    ЗаписьXML.УстановитьСтроку();
		ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ИнформацияРасшифровки);
		Если ДанныеРасшифровки <> Неопределено Тогда
	    	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДанныеРасшифровки);
			Запись.ИнформацияРасшифровки = ЗаписьXML.Закрыть();
		Иначе
			Запись.ИнформацияРасшифровки = "";
		КонецЕсли;
	КонецЕсли;
	
    Запись.ОбновлятьПриОбмене = ОбновлятьПриОбмене;
    Запись.Содержимое = Новый ХранилищеЗначения(Содержимое);
    
    НаборЗаписей.Записать();
    
КонецПроцедуры

// Процедура очищает содержимое отчета после изменения настроек
&НаСервере
Процедура ПриИзмененииНастроек(НовоеНастройки, НовоеОбновлятьПриОбмене)
	
	Если ИнформацияРасшифровки <> "" Тогда
		УдалитьИзВременногоХранилища(ИнформацияРасшифровки);
	КонецЕсли;
    Настройки = НовоеНастройки;
    ОбновлятьПриОбмене = НовоеОбновлятьПриОбмене;
    Содержимое = Новый ТабличныйДокумент();
    Секция = Содержимое.Область("R1C1");
    Секция.Текст = НСтр("ru = 'Отчет не сформирован.'") + Символы.ПС;
    Если ОбновлятьПриОбмене = Истина Тогда
        Секция.Текст = Секция.Текст + НСтр("ru = 'Он будет получен при синхронизации данных.'");
    Иначе
        Секция.Текст = Секция.Текст + НСтр("ru = 'Нажмите кнопку ""Обновить"".'");
	КонецЕсли;
    ОбновитьЗапись();
    
КонецПроцедуры

// Процедура выполняет удаленное построение отчета в основной базе. через опубликованный ею веб-сервис
&НаСервере
Функция ПолучитьОтчет(ТекстОшибки)
    
	Если ИнформацияРасшифровки <> "" Тогда
		УдалитьИзВременногоХранилища(ИнформацияРасшифровки);
	КонецЕсли;
    ДанныеРасшифровки = Неопределено;
#Если МобильныйАвтономныйСервер Тогда
    Содержимое = ОсновнойСервер.ОбменМобильныеПереопределяемый.СформироватьОтчет(Настройки, ДанныеРасшифровки);
#Иначе
    Содержимое = ОбменМобильныеПереопределяемый.СформироватьОтчет(Настройки, ДанныеРасшифровки);
#КонецЕсли
	
	Если ДанныеРасшифровки = Неопределено Тогда
		ИнформацияРасшифровки = "";
	Иначе
		ИнформацияРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
	КонецЕсли;
    Возврат Содержимое <> Неопределено;

КонецФункции

//////////////////////////////////////////////////////////////////////////////// 
// ОБРАБОТЧИКИ СОБЫТИЙ 
// 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
	ПрочитатьЗапись();    
    
КонецПроцедуры

&НаКлиенте
Процедура Сформировать(Команда)
    
#Если МобильныйКлиент Тогда 
	Если Не ОсновнойСерверДоступен() = Ложь Тогда
	    ТекстОшибки = "";
	    Если Не ПолучитьОтчет(ТекстОшибки) И ТекстОшибки <> "" Тогда
			Предупреждение(ТекстОшибки);
		КонецЕсли;
	    ОбновитьЗапись();
	Иначе
		ПрочитатьЗапись();
	КонецЕсли
#КонецЕсли
    
КонецПроцедуры

&НаКлиенте
Процедура Настройки(Команда)
    
    ПараметрыНастроек = Новый Структура("Настройки,ОбновлятьПриОбмене", Настройки, ОбновлятьПриОбмене);
    Форма = ПолучитьФорму("Отчет.ОстаткиТоваровНаСкладахМобильный.Форма.ФормаНастроек", ПараметрыНастроек);
	Форма.ОписаниеОповещенияОЗакрытии =
		Новый ОписаниеОповещения("РезультатНастройкиОтчета", ЭтотОбъект, Форма);
	Форма.Открыть();
    
КонецПроцедуры

&НаКлиенте
Процедура РезультатНастройкиОтчета(Результат, Контекст) Экспорт
	
	Если Результат = КодВозвратаДиалога.Отмена Тогда 
		Возврат;
	КонецЕсли;
    ПриИзмененииНастроек(Контекст.Настройки, Контекст.ОбновлятьПриОбмене);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "ПрошелОбмен" И ОбновлятьПриОбмене Тогда
        ПрочитатьЗапись();    
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура СодержимоеОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
	
    СтандартнаяОбработка = Ложь;
	Если ИнформацияРасшифровки <> "" Тогда
		ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ИнформацияРасшифровки);
		Если ДанныеРасшифровки <> Неопределено Тогда
		    Значение = ДанныеРасшифровки.Получить(Расшифровка);
			Если Значение <> Неопределено И Значение <> Null Тогда
		        ОткрытьЗначение(Значение);
			КонецЕсли;
	    КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
